package com.ybkj.daijia.server.mapper;

import com.ybkj.daijia.common.SquareLocation;
import com.ybkj.daijia.server.model.Driver;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;

public interface DriverMapper {

    /**
     * 自定义参数查询驾驶员
     * @param driverPhone
     * @param driverName
     * @return
     */
    List<Driver> queryDriverByParams(@Param("driverPhone") String driverPhone, @Param("driverName") String driverName);

    /**
     * 修改司机提现、推广开关
     *
     * @param driver
     */
    void updateDriverTxAndTg(Driver driver);

    /**
     * 查询username最大的司机
     *
     * @return
     */
    Driver findLastestDriver();

    /**
     * 根据主键更新司机推送信息
     *
     * @param userID
     * @param deviceType
     * @param id
     * @return
     */
    int updatePushByPrimaryKey(
        @Param("userID") String userID, @Param("deviceType") String deviceType,
        @Param("id") Long id);

    /**
     *
     *
     * @param driver
     * @return
     */
    int updateLoginInfoByPrimaryKey(Driver driver);

    /**
     * 清除个推推送信息
     *
     * @param userId
     * @return
     */
    int clearGetuiPushInfo(@Param("userId") String userId);

    /**
     * 清除极光推送信息
     *
     * @param registrationId
     * @return
     */
    int clearJiguangPushInfo(@Param("registrationId") String registrationId);

    /**
     * 功能同上(包含司机状态空闲,忙碌的)
     *
     * @param squareLocation
     * @return
     */
    List<Driver> selectByNearlyErrand(SquareLocation squareLocation);

    /**
     * 功能同上(包含司机状态空闲,忙碌的)
     *
     * @param squareLocation
     * @return
     */
    List<Driver> selectByNearlyZhuanxian(SquareLocation squareLocation);

    /**
     * 调度推荐跑腿司机
     *
     * @param
     */
    List<Driver> selectTuijianDiaoduErrandDrivers();

    /**
     * 调度搜索跑腿司机
     *
     * @param
     */
    List<Driver> selectDiaoduErrandDriversByParam(@Param("param") String param);

    /**
     *
     *
     * @param companyId
     * @param name
     * @param phone
     * @param username
     * @param start
     * @param end
     * @param virtual
     * @param isFreeze
     * @param type
     * @param status
     * @param isPlatform
     * @param isLeague
     * @param offset
     * @param size
     * @return
     */
    List<Driver> selectDriverList(@Param("companyId") Long[] companyId, @Param("name") String name,
        @Param("phone") String phone, @Param("username") String username,
        @Param("start") Date start, @Param("end") Date end, @Param("virtual") BigDecimal virtual,
        @Param("isFreeze") Boolean isFreeze,
        @Param("type") String[] type, @Param("status") Integer[] status,
        @Param("isPlatform") Integer[] isPlatform, @Param("jobType") String[] jobType,
        @Param("isLeague")Boolean isLeague, @Param("offset") Integer offset, @Param("size") Integer size);

    /**
     *
     *
     * @param companyId
     * @param name
     * @param phone
     * @param username
     * @param start
     * @param end
     * @param virtual
     * @param isFreeze
     * @param type
     * @param status
     * @param isPlatform
     * @param isLeague
     * @return
     */
    Long countDriverList(@Param("companyId") Long[] companyId, @Param("name") String name,
        @Param("phone") String phone, @Param("username") String username,
        @Param("start") Date start, @Param("end") Date end, @Param("virtual") BigDecimal virtual,
        @Param("isFreeze") Boolean isFreeze,
        @Param("type") String[] type, @Param("status") Integer[] status,
        @Param("isPlatform") Integer[] isPlatform, @Param("jobType") String[] jobType,
        @Param("isLeague")Boolean isLeague);

    /**
     *
     *
     * @param squareLocation
     * @return
     */
    List<Driver> selectByNearlyFreight(SquareLocation squareLocation);

    /**
     * 保存司机信息
     *
     * @param record
     * @return
     */
    int insertRecord(Driver record);

    /**
     * 根据主键查询司机信息
     *
     * @param id
     * @return
     */
    Driver selectByPrimaryKey(Long id);

    /**
     * 根据一组主键查询司机信息
     *
     * @param ids
     * @return
     */
    List<Driver> selectByIdIn(Long ids[]);

    /**
     * 根据主键删除司机信息
     *
     * @param id
     * @return
     */
    int deleteByPrimaryKey(Long id);

    /**
     * 删除车辆关系
     *
     * @param carId
     * @return
     */
    int deleteCarRelation(Long carId);

    /**
     * 删除专线车辆关系
     *
     * @param carId
     * @return
     */
    int deleteZhuanxianCarRelation(Long carId);


    /**
     * 根据主键更新司机位置信息
     *
     * @param longitude
     * @param latitude
     * @param lastLongitude
     * @param lastLatitude
     * @param currentAddress
     * @param driverId
     * @return
     */
    int updatePosByPrimaryKey(
        @Param("longitude") Double longitude,
        @Param("latitude") Double latitude,
        @Param("lastLongitude") Double lastLongitude,
        @Param("lastLatitude") Double lastLatitude,
        @Param("currentAddress") String currentAddress,
        @Param("driverId") Long driverId);

    int updatePosUpdated(@Param("driverId") Long driverId, @Param("posUpdated") Date posUpdated);

    /**
     * 根据主键更新司机余额信息
     *
     * @param virtual
     * @param id
     * @return
     */
    int updateVirtualByPrimaryKey(@Param("virtual") BigDecimal virtual,
        @Param("id") Long id);

    /**
     * 根据主键更新司机推送信息
     *
     * @param channelId
     * @param userID
     * @param deviceType
     * @param id
     * @return
     */
    int updatePushByPrimaryKey(@Param("channelId") String channelId,
        @Param("userID") String userID, @Param("deviceType") String deviceType,
        @Param("id") Long id);

    /**
     * 根据主键更新密码
     *
     * @param password
     * @param id
     * @return
     */
    int updatePasswordByPrimaryKey(@Param("password") String password,
        @Param("id") Long id);

    /**
     * 根据主键更新司机状态
     *
     * @param status
     * @param id
     * @return
     */
    int updateStatusByPrimaryKey(@Param("status") Integer status, @Param("id") Long id);

    /**
     * 修改司机的专车车辆id
     *
     * @param driverId
     * @param carId
     * @return
     */
    int updateCarId(@Param("driverId") Long driverId, @Param("carId") Long carId);

    int updateStatusAndJobStatusByPrimaryKey(@Param("status") Integer status,
        @Param("jobStatus") Integer jobStatus, @Param("id") Long id);

    int updateStatusAndJobStatusForOnlinedByPrimaryKey(@Param("status") Integer status,
        @Param("jobStatus") Integer jobStatus, @Param("id") Long id);

    int jiebang(@Param("id") Long id);

    int online(@Param("status") Integer status, @Param("id") Long id);

    /**
     * 根据主键更新司机信息
     *
     * @param record
     * @return
     */
    int updateByPrimaryKey(Driver record);

    /**
     * 根据用户名查询司机信息
     *
     * @param username
     * @return
     */
    Driver selectByUsername(@Param("username") String username);


    Driver selectByCarId(@Param("carId") Long carId);

    /**
     * 根据状态查询司机信息
     *
     * @param status
     * @return
     */
    List<Driver> selectByStatus(@Param("status") Integer status);

    /**
     * 根据设备号查询司机信息
     *
     * @param udid
     * @return
     */
    List<Driver> selectByUdid(@Param("udid") String udid);

    /**
     * 根据身份证查询司机信息
     *
     * @param idCard
     * @return
     */
    Driver selectByIdCard(@Param("idCard") String idCard);

    /**
     * 根据手机号查询司机信息
     *
     * @param phone
     * @return
     */
    Driver selectByPhone(@Param("phone") String phone);

    /**
     * 根据主键更新司机今日工单
     *
     * @param todayOrders
     * @param id
     * @return
     */
    int updateTodayOrdersByPrimaryKey(
        @Param("todayOrders") Integer todayOrders, @Param("id") Long id);

    /**
     * 根据主键更新司机月工单
     *
     * @param monthOrders
     * @param id
     * @return
     */
    int updateMonthOrdersByPrimaryKey(
        @Param("monthOrders") Integer monthOrders, @Param("id") Long id);

    /**
     * 完成订单时，跟新司机信息
     *
     * @param driver
     * @return
     */
    void updateWhenFinishOrderByKey(Driver driver);

    void updateWhenFinishZhuanOrderByKey(Driver driver);

    /**
     * 统计所有司机余额
     *
     * @param companyId 不指定公司主键则为所有
     * @return
     */
    BigDecimal sumVirtual(@Param("companyId") Long companyId);

    BigDecimal sumImprestMoney(@Param("companyId") Long companyId, @Param("name") String param);

    BigDecimal sumBalanceMoney(@Param("companyId") Long companyId, @Param("name") String param);

    /**
     * 重置今日订单数量
     *
     * @return
     */
    int resetTodayOrdersNums();

    /**
     * 重置月份订单数量
     *
     * @return
     */
    int resetMonthOrderNums();

    /**
     * 查询所有工作中的司机
     *
     * @param companyId 不指定公司为查询所有
     * @return
     */
    List<Driver> selectByWorking(@Param("companyId") Long companyId);

    /**
     * 查询未被冻结的所有司机
     *
     * @param companyId 不指定公司为查询所有
     * @return
     */
    List<Driver> selectByNotFreezed(@Param("companyId") Long companyId);

    /**
     * 查询未被冻结但是处于离线的司机
     *
     * @param companyId 不指定公司为查询所有
     * @return
     */
    List<Driver> selectByOfflineNotFreezed(@Param("companyId") Long companyId);

    /**
     * 根据类型和冻结状态查询司机信息
     *
     * @param type      不指定类型为所有
     * @param isFreeze  冻结状态，不指定为所有
     * @param companyId 不指定公司为查询所有
     * @return
     */
    List<Driver> selectByTypeAndFreeze(@Param("type") String type,
        @Param("isFreeze") Boolean isFreeze,
        @Param("companyId") Long companyId);

    /**
     * 查询所有司机
     *
     * @return
     */
    List<Driver> selectAll();

    List<Driver> selectAllByCompany(@Param("companyId") Long companyId);

    /**
     * 清除推送信息
     *
     * @param channelID
     * @param userID
     * @return
     */
    int clearPushInfo(@Param("channelID") String channelID,
        @Param("userID") String userID);

    /**
     * 查询调度
     *
     * @param cityName
     * @return
     */
    List<Driver> selectDiaodu(@Param("cityName") String cityName,
        @Param("driverJobType") String driverJobType);

    List<Driver> selectDiaoduv3(@Param("cityName") String cityName,
        @Param("lixian") Integer lixian);

    long countDiaoduLixian(@Param("cityName") String cityName);

    Long countDiaoduLixianByCompanyId(@Param("companyId") Long companyId);

    /**
     * 跑腿派单
     *
     * @return
     */
    List<Driver> selectPaotuiPaidan(@Param("cityName") String cityName,
        @Param("driverJobType") String driverJobType);

    /**
     * 根据参数分页查询司机信息 (参数：companyId、name、status、type、isFreeze、virtual、offset、size)
     *
     * @param params
     * @return
     */
    List<Driver> selectByPage(Map<String, Object> params);

    /**
     * 根据参数统计司机数量 (参数：companyId、name、status、type、isFreeze、virtual)
     *
     * @param params
     * @return
     */
    long countByPage(Map<String, Object> params);

    /**
     * 查询附近的司机 (方形查找)
     *
     * @param squareLocation
     * @return
     */
    List<Driver> selectByNearly(SquareLocation squareLocation);

    /**
     * 自动派单推荐司机 (方形查找)
     *
     * @param squareLocation
     * @return
     */
    List<Driver> selectPaidanTuijian(SquareLocation squareLocation);

    /**
     * 查询附近正在工作的司机
     *
     * @param squareLocation
     * @return
     */
    List<Driver> selectByNearlyWorking(SquareLocation squareLocation);

    /**
     * 查询附近正在工作的代驾司机
     *
     * @param squareLocation
     * @return
     */
    List<Driver> selectByNearlyWorkingDaijia(SquareLocation squareLocation);

    /**
     * 微信查询附近正在工作的代驾司机
     *
     * @param squareLocation
     * @return
     */
    List<Driver> selectWeixinDriverByDaijia(SquareLocation squareLocation);

    /**
     * 查询附近正在工作的代驾司机
     *
     * @param squareLocation
     * @return
     */
    List<Driver> selectByNearlyWorkingZhuanche(SquareLocation squareLocation);

    /**
     * 查询附近正在工作的货运司机
     *
     * @param squareLocation
     * @return
     */
    List<Driver> selectByNearlyWorkingFreight(SquareLocation squareLocation);

    /**
     * 分页查询附近在工作的司机 参数（rightBottomLat\leftTopLat\leftTopLng\rightBottomLng\offset\size）
     *
     * @param params
     * @return
     */
    List<Driver> selectByPageNearlyWorking(Map<String, Object> params);

    /**
     * 统计附近在工作的工作车 参数（rightBottomLat\leftTopLat\leftTopLng\rightBottomLng\offset\size）
     *
     * @param params
     * @return
     */
    long countByPageNearlyWorking(Map<String, Object> params);

    /**
     * 不分页根据参数查询司机信息 (参数：companyId、name、status、type、isFreeze、virtual)
     *
     * @param params
     * @return
     */
    List<Driver> selectByParams(Map<String, Object> params);

    /**
     * 查询指定地区不包含指定司机的其他在工作的司机
     *
     * @param cityName
     * @param driverID
     * @return
     */
    List<Driver> selectByAreaNotIncludeSelf(@Param("cityName") String cityName,
        @Param("driverID") Long driverID, @Param("driverJobType") String driverJobType);


    List<Driver> selectZhuandanEmploys(@Param("cityName") String cityName,
        @Param("employId") Long employId,
        @Param("driverJobType") String driverJobType, @Param("offset") Integer offset,
        @Param("size") Integer size);


    long countZhuandanEmploys(@Param("cityName") String cityName, @Param("employId") Long employId,
        @Param("driverJobType") String driverJobType);

    /**
     * 查询相同地区中正在工作的司机
     *
     * @param cityName
     * @return
     */
    List<Driver> selectByWorkingArea(@Param("cityName") String cityName);

    /**
     * 根据公司、参数查询司机信息
     *
     * @param companyId
     * @return
     */
    List<Driver> selectByCompanyWithParam(@Param("companyId") Long companyId,
        @Param("param") String param);

    /**
     * 根据公司,介绍人分组查询司机信息
     *
     * @param companyId
     * @param introducer
     * @return
     */
    List<Driver> selectByCompanyWithIntroducerGroupIntroducer(@Param("companyId") Long companyId,
        @Param("introducer") String introducer);

    /**
     * 查询没有推荐人的司机
     *
     * @param introducer
     */
    List<Driver> selectNotIntroducer(@Param("driverJobType") String driverJobType,
        @Param("introducer") String introducer);


    /**
     * 根据介绍人查询司机信息
     *
     * @param introducer
     * @return
     */
    List<Driver> selectByIntroducer(@Param("introducer") String introducer);

    /**
     * 根据昵称,工号,电话,真实电话
     */
    List<Driver> selectByParam(@Param("param") String param, @Param("companyId") Long companyId);

    /**
     * 调度推荐代驾司机
     *
     * @param
     */
    List<Driver> selectTuijianDiaoduDaijiaDrivers();

    /**
     * 调度推荐专车司机
     *
     * @param
     */
    List<Driver> selectTuijianDiaoduZhuancheDrivers();

    /**
     * 调度推荐货运司机
     *
     * @param
     */
    List<Driver> selectTuijianDiaoduFreightDrivers();

    /**
     * 调度推荐专线司机
     *
     * @param
     */
    List<Driver> selectTuijianDiaoduZhuanxianDrivers();

    /**
     * 调度搜索代驾司机
     *
     * @param
     */
    List<Driver> selectDiaoduDaijiaDriversByParam(@Param("param") String param);

    /**
     * 调度搜索专车司机
     *
     * @param
     */
    List<Driver> selectDiaoduZhuancheDriversByParam(@Param("param") String param);

    /**
     * 调度搜索货运司机
     *
     * @param
     */
    List<Driver> selectDiaoduFreightDriversByParam(@Param("param") String param);

    /**
     * 调度搜索专线司机
     *
     * @param
     */
    List<Driver> selectDiaoduZhuanxianDriversByParam(@Param("param") String param);

    List<Driver> selectDriverList(@Param("companyId") Long companyId, @Param("name") String name,
        @Param("phone") String phone, @Param("username") String username,
        @Param("start") Date start, @Param("end") Date end, @Param("virtual") BigDecimal virtual,
        @Param("isFreeze") Boolean isFreeze,
        @Param("type") String[] type, @Param("status") Integer[] status,
        @Param("offset") Integer offset, @Param("size") Integer size);

    Long countDriverList(@Param("companyId") Long companyId, @Param("name") String name,
        @Param("phone") String phone, @Param("username") String username,
        @Param("start") Date start, @Param("end") Date end, @Param("virtual") BigDecimal virtual,
        @Param("isFreeze") Boolean isFreeze,
        @Param("type") String[] type, @Param("status") Integer[] status);

    Driver selectByTruckId(Long truckId);

    Driver selectByZhuanxianCarId(Long carid);

    int updateGrad2NullByGrade(Long id);

    List<Driver> selectByZhuanxianCars(@Param("carIds") List<Long> carIds);

    int insertList(List<Driver> list);

    Long countById(@Param("driverId") Long driverId);

    /**
     * 修改服务人员上传状态
     *
     */
    void updateUpStatus(@Param("driverId") Long driverId);

    void updateDriverRebate(@Param("rebateMoney") BigDecimal rebateMoney,
        @Param("driverId") Long driverId);

    int updateWxRebateQrCodeUrl(@Param("wxRebateQrCodeUrl") String wxRebateQrCodeUrl,
        @Param("id") Long id);

    int updateColumnsIfNotNull(@Param("driver")Driver driver);
}
